﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using ModeloGaleriaNET.VendedorArteCommands;
using System.Windows.Controls;
using System.Xml.Schema;
using ModeloGaleriaNET.Police;
using Newtonsoft.Json;

namespace ModeloGaleriaNET
{
    public class FinalizarSubastaMessage: IMessageType
    {
        private VendedorArteCommands.VendedorArteCommands vendedor;
        private Subasta subasta;
        private VendedorArteCommands.AuthInfo auth;
        private long pujaWinner;
        private string lastEstado;
        private AvalonDock.DockableContent doc;
        private int usuarioId;
        private GandalfService policia;
        
        public FinalizarSubastaMessage(Subasta s, long win, AvalonDock.DockableContent d, int uId)
        {
            policia = new GandalfService();
            doc = d;
            subasta = s;
            lastEstado = string.Copy(s.EstadoActual.Estado);
            vendedor = new VendedorArteCommands.VendedorArteCommands();
            vendedor.Timeout = (int)ServerConnData.Instance.TimeOut*1000;
            auth = new AuthInfo();
            auth.pseudonimo = ServerConnData.Instance.User;
            auth.password = Utilities.EncriptarMD5(ServerConnData.Instance.Password);
            pujaWinner = win;
            this.usuarioId = uId;
        }

        public int UsuarioId
        {
            get { return usuarioId; }
        }

        public Subasta Subasta
        {
            get { return subasta; }
        }

        public string LastEstado
        {
            get { return lastEstado; }
        }

         public int Execute()
         {
             authInfo authPolice;
             getTicketResponse ticketResponse;
             AESCripto aes;
             string json;
             byte[] encriptado;
             ModeloGaleriaNET.VendedorArteCommands_Safe.finalizarSubastaRequest req;
             ModeloGaleriaNET.VendedorArteCommands_Safe.VendedorArteCommandsService vendedorSafe;
             ModeloGaleriaNET.VendedorArteCommands_Safe.ticketEncryptedRequest request;

             if (ModeloGaleriaNET.Properties.Settings.Default.Seguridad == 2 || ModeloGaleriaNET.Properties.Settings.Default.Seguridad == 3)
             //if (ModeloGaleriaNET.Properties.Settings.Default.Seguridad == 4)
             {
                 req = new VendedorArteCommands_Safe.finalizarSubastaRequest();
                 req.referencia = Convert.ToInt64(subasta.ReferenciaExterna);
                 req.numeroPuja = pujaWinner;
                 json = JsonConvert.SerializeObject(req);
                 // Crear mensaje encriptado con el JSON y enviar

                 policia.Url = ModeloGaleriaNET.Properties.Settings.Default.Seguridad == 2 ?
                   ModeloGaleriaNET.Properties.Settings.Default.ModeloGaleriaNET_Police_GandalfService :
                   ModeloGaleriaNET.Properties.Settings.Default.ModeloGaleriaNET_Police_GandalfService_SSL;
                 policia.Timeout = (int)ModeloGaleriaNET.Properties.Settings.Default.TimeOut * 1000;
                 authPolice = new authInfo();
                 authPolice.pseudonimo = ServerConnData.Instance.User;
                 authPolice.password = Utilities.EncriptarMD5(ServerConnData.Instance.Password);
                 ticketResponse = policia.getTicket(authPolice);

                 aes = new AESCripto(ticketResponse.secretKey);
                 encriptado = aes.EncryptStringToBytes(json);

                 vendedorSafe = new VendedorArteCommands_Safe.VendedorArteCommandsService();
                 vendedorSafe.Url = ModeloGaleriaNET.Properties.Settings.Default.Seguridad == 2 ?
                    ModeloGaleriaNET.Properties.Settings.Default.ModeloGaleriaNET_VendedorArteCommands_Safe_VendedorArteCommandsService :
                    ModeloGaleriaNET.Properties.Settings.Default.ModeloGaleriaNET_VendedorArteCommands_Safe_VendedorArteCommandsService_SSL;
                 vendedorSafe.Timeout = (int)ModeloGaleriaNET.Properties.Settings.Default.TimeOut * 1000;
                 request = new VendedorArteCommands_Safe.ticketEncryptedRequest();
                 request.message = encriptado;
                 request.ticketId = ticketResponse.ticketId;
                 vendedorSafe.finalizarSubastaEncrypted(request);
             }
             else
             {
                 vendedor.Url = Properties.Settings.Default.Seguridad == 0 ? 
                     Properties.Settings.Default.ModeloGaleriaNET_VendedorArteCommands_VendedorArteCommands :
                      Properties.Settings.Default.ModeloGaleriaNET_VendedorArteCommands_VendedorArteCommands_SSL;
                 vendedor.finalizar(auth, Convert.ToInt64(subasta.ReferenciaExterna), true, pujaWinner, true);
             }
             return -1;
         }

         public void printInitialMessage()
         {
             Utilities.WriteMessageOnGrid(doc, "[Local]\tFinalizando la subasta con referencia local " + subasta.Id + "...",
                 DataGridMessage.TIPO_MENSAJE.INFO);
         }

         public void printErrorMessage()
         {
             Utilities.WriteMessageOnGrid(doc, "[Local]\tHa ocurrido un error al finalizar la subasta con referencia local " + subasta.Id,
                 DataGridMessage.TIPO_MENSAJE.WARNING);
         }

         public void printLastErrorMessage()
         {
             Utilities.WriteMessageOnGrid(doc, "[Local]\tNo se ha podido finalizar la subasta con referencia "
                     + subasta.Id + " después de 3 intentos. Se han desecho los cambios en local",
                 DataGridMessage.TIPO_MENSAJE.ERROR);
         }

         public void printSuccessMessage()
         {
             Utilities.WriteMessageOnGrid(doc, "[Local]\tLa subasta con referencia " + subasta.Id + " se ha finalizado con éxito",
                 DataGridMessage.TIPO_MENSAJE.INFO);
         }
    }
}
